/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.mbean;

import com.brain.comp.dto.PlanPagoDto;
import com.brain.comp.manager.PlanPagoManager;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.manager.MonedaManager;
import com.brain.core.common.ExportarExcelCaja;
import com.brain.core.common.ExportarExcelCaja.PlanPago;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.FechaFiltroDto;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.fina.dto.PagoDto;
import com.brain.fina.manager.PagoManager;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Hvives
 */

@Controller("planPagoMBean")
@Scope("session")
public class PlanPagoMBean extends GenericMBean implements Serializable{
    
    private static Logger logger = Logger.getLogger(PlanPagoMBean.class);
    
    @Autowired
    private ApplicationMBean applicationMBean;
    
    @Autowired
    private SessionMBean sessionMBean;
    
    @Resource
    private RecursosManager recursosManager;
    
    @Resource
    private PlanPagoManager manager;
    
    @Resource
    private MonedaManager managerMoneda;
    
    @Resource
    private PagoManager managerPago;
    
    private PlanPagoDto dto;
    private PlanPagoDto dtoFiltro;
    private FechaFiltroDto fechaFiltro;
    private List<PlanPagoDto> lista;    
    private String keyTitulo = "";
    private String keyTituloPago = "";
    private String tituloDetalle = "";
    private SelectItem[] siEstadosBusqueda;
    private SelectItem[] siEstadosTipoDoc;
    private List<ParametroDto> listaFormaPago;
    private List<MonedaDto> listaMonedas;
    private PagoDto pagoDto;
    private List<PagoDto> listaPagos;
    private Date fechaActual;
    private PlanPagoDto[] selectedPPs;
    private ExportarExcelCaja.PlanPago ppExcel;
    private String tipoXls;
    private Boolean checkExcel;
    
    public String iniciar(){
        this.dto = null;
        this.dtoFiltro = new PlanPagoDto();
        this.lista = null;
        this.pagoDto = null;
        this.fechaFiltro = new FechaFiltroDto();
        this.fechaFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.fechaFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.ppExcel = new ExportarExcelCaja.PlanPago(true);
        this.selectedPPs = null;
        
        return this.manager.getUrlLista();
    }
    
    public void buscar(){
        try {
            this.lista = this.manager.obtenerDocumentosXPagar(this.dtoFiltro, this.fechaFiltro);
        } catch (DAOException e) {
            logger.error("ERROR DE SISTEMA", e);
            showError("Error de Sistema", e.getMessage());
        }
    }
                
    public String guardar(){
        if (this.manager.guardar(this.dto) != null){
            this.editar();
        }
        return null;
    }
    
    public String pagar(){
        if (this.manager.pagar(this.dto) != null){
            this.editar();
        }
        return null;
    }
    
    public String pagarUbicacion(){
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        
        this.pagoDto = asignarMontoConvertido(this.pagoDto);
        
        if (this.pagoDto.getFactorConversion() == null){
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("cobro.detalle.no.tipo.cambio"));
                resultado = false;
        }
        else {
            if (validarSumaPagos(this.pagoDto)){
                if (managerPago.pagar(this.pagoDto) != null){
                    BigDecimal pagado = dto.getPagado().add(pagoDto.getMontoConvertido());
                    dto.setPagado(pagado);
                    BigDecimal pendiente = dto.getLiquidar().subtract(pagado);
                    dto.setPendiente(pendiente);
                    if (dto.getPendiente().equals(BigDecimal.ZERO)){
                        this.manager.pagar(dto);
                    }
                    else{
                        int index = dto.getListPago().indexOf(pagoDto);
                        dto.getListPago().set(index, pagoDto);
                        this.manager.pagarPago(this.dto);
                    }
                    this.editar();
                }
            }
            else {
                resultado = false;
            }
        }
        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
        
    public void nuevoDetalle(){
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyTituloPago, sessionMBean.getAccionDetalle());
        this.pagoDto = this.managerPago.inicializar();
        this.pagoDto.setPlanPagoDto(this.dto);
        this.pagoDto.setMonedaDto(this.dto.getMonedaDto());
        this.pagoDto.setFormaPagoDto(this.dto.getFormaPagoDto());
    }
    
    public String retroceder(){
        buscar();
        return manager.getUrlLista();
    }
    
    public String editar(){
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        try {
            this.listaPagos = managerPago.obtenerTodosPorId(this.dto);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
        return manager.getUrl();
    }
    
    public void editarPago(){
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyTituloPago, sessionMBean.getAccionDetalle());
        sessionMBean.setTitulo(this.tituloDetalle);
        try {
            this.pagoDto = managerPago.obtenerPorId(this.pagoDto.getId());
        } catch (DAOException e) {
            logger.error(e);
        }
    }
    
    public String ver(){
        sessionMBean().setAccion(applicationMBean.getVer());
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return manager.getUrl();
    }
    
    public void verPago(){
        this.tituloDetalle = recursosManager.construirTitulo(keyTituloPago, sessionMBean().getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        try {
            this.pagoDto = managerPago.obtenerPorId(this.pagoDto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }
    
    public void guardarPagoUbicacion() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            this.pagoDto = asignarMontoConvertido(this.pagoDto);
            if (this.pagoDto.getFactorConversion() == null){
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("cobro.detalle.no.tipo.cambio"));
                resultado = false;
            }
            else {
                if (validarSumaPagos(pagoDto)){                    
                    if (managerPago.guardar(pagoDto) != null) {
                        this.dto = this.manager.obtenerPorId(this.dto.getId());
                    }else{
                        resultado = false;
                    }
                }
                else{
                    resultado = false;
                }
            }            
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    public PagoDto asignarMontoConvertido(PagoDto dto){
        PagoDto p = manager.unificarDatosCobroDetalle(dto, this.dto);
        if (p.getFactorConversion() != null){
            p.setMontoConvertido(p.getMonto().multiply(p.getFactorConversion()));
        }
        return p;
    }
    
    public boolean validarSumaPagos(PagoDto pDto){
        String mensajeTrx = "";
        BigDecimal suma = BigDecimal.ZERO;
        
        for (PagoDto x: this.dto.getListPago()){
            if (!x.getId().equals(pDto.getId())){
                suma = suma.add(x.getMontoConvertido());
            }            
        }
        if ((suma.add(pDto.getMontoConvertido())).compareTo(this.dto.getLiquidar())==1){
            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("pago.mensaje.monto.superado");
            recursosManager.showError(mensajeTrx);
            return false;
        }
        else{
            return true;
        }
    }
    
    public void eliminarPago(){
        try {
            this.managerPago.eliminar(this.pagoDto);
            this.dto = this.manager.obtenerPorId(this.dto.getId());
        } catch (DAOException e) {
            logger.error(e.getMessage());
        }
    }
    
    private void generarExcelSeleccionadosPlanPago() {
        this.manager.generarExcelSeleccionados(ppExcel, selectedPPs);
    }
    
    private void generarExcelPorTablaPlanPago() {
        this.manager.generarExcelPorTabla(ppExcel, lista);
    }
    
    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaPlanPago();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosPlanPago();
        }
    }
    
    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.plan.pago"));
            }
        } else if (tipo.equals("S")) {

            if (selectedPPs.length <= 0) {
                System.out.println(selectedPPs.length);
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.plan.pago"));
            }

        }
        if (resultado) {
            this.ppExcel = new ExportarExcelCaja.PlanPago(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    public void onChangeChekExcel() {
        this.ppExcel = manager.onChangeChekExcel(checkExcel);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PlanPagoMBean.logger = logger;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public PlanPagoManager getManager() {
        return manager;
    }

    public void setManager(PlanPagoManager manager) {
        this.manager = manager;
    }

    public PlanPagoDto getDto() {
        return dto;
    }

    public void setDto(PlanPagoDto dto) {
        this.dto = dto;
    }

    public PlanPagoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(PlanPagoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public FechaFiltroDto getFechaFiltro() {
        return fechaFiltro;
    }

    public void setFechaFiltro(FechaFiltroDto fechaFiltro) {
        this.fechaFiltro = fechaFiltro;
    }    

    public List<PlanPagoDto> getLista() {
        return lista;
    }

    public void setLista(List<PlanPagoDto> lista) {
        this.lista = lista;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public String getKeyTituloPago() {
        return keyTituloPago;
    }

    public void setKeyTituloPago(String keyTituloPago) {
        this.keyTituloPago = keyTituloPago;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public SelectItem[] getSiEstadosBusqueda() {
        siEstadosBusqueda = manager.siTiposPlanPagoTodos();
        return siEstadosBusqueda;
    }

    public void setSiEstadosBusqueda(SelectItem[] siEstadosBusqueda) {
        this.siEstadosBusqueda = siEstadosBusqueda;
    }

    public SelectItem[] getSiEstadosTipoDoc() {
        siEstadosTipoDoc = manager.siTiposDocumentosTodos();
        return siEstadosTipoDoc;
    }

    public void setSiEstadosTipoDoc(SelectItem[] siEstadosTipoDoc) {
        this.siEstadosTipoDoc = siEstadosTipoDoc;
    }

    public List<ParametroDto> getListaFormaPago() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesComp.CatalogoParametro.FORMA_PAGO);
    }

    public void setListaFormaPago(List<ParametroDto> listaFormaPago) {
        this.listaFormaPago = listaFormaPago;
    }

    public List<MonedaDto> getListaMonedas() throws DAOException{
        listaMonedas = managerMoneda.obtenerMonedasActivasPorEmpresa();
        return listaMonedas;
    }

    public void setListaMonedas(List<MonedaDto> listaMonedas) {
        this.listaMonedas = listaMonedas;
    }

    public PagoDto getPagoDto() {
        return pagoDto;
    }

    public void setPagoDto(PagoDto pagoDto) {
        this.pagoDto = pagoDto;
    }

    public List<PagoDto> getListaPagos() {
        return listaPagos;
    }

    public void setListaPagos(List<PagoDto> listaPagos) {
        this.listaPagos = listaPagos;
    }

    public Date getFechaActual() {
        return UtilCore.Fecha.obtenerFechaActualDate();
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public MonedaManager getManagerMoneda() {
        return managerMoneda;
    }

    public void setManagerMoneda(MonedaManager managerMoneda) {
        this.managerMoneda = managerMoneda;
    }

    public PagoManager getManagerPago() {
        return managerPago;
    }

    public void setManagerPago(PagoManager managerPago) {
        this.managerPago = managerPago;
    }

    public PlanPagoDto[] getSelectedPPs() {
        return selectedPPs;
    }

    public void setSelectedPPs(PlanPagoDto[] selectedPPs) {
        this.selectedPPs = selectedPPs;
    }

    public PlanPago getPpExcel() {
        return ppExcel;
    }

    public void setPpExcel(PlanPago ppExcel) {
        this.ppExcel = ppExcel;
    }

    public String getTipoXls() {
        return tipoXls;
    }

    public void setTipoXls(String tipoXls) {
        this.tipoXls = tipoXls;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }
}
